#include "DemiOgre.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

const unsigned DemiOgre::nbrEnsembles = 1;

const unsigned DemiOgre::nbrCapacites = 1;

const unsigned DemiOgre::ppAlloues = 15;

const vector< vector< unsigned > > DemiOgre::ensembleRacial =
  list_of< vector< unsigned> >( list_of( 5 ) );

const unsigned DemiOgre::taille = 6;

/**
 * Contient les capacités, puis les ensembles raciaux, à la fin.
 */
const vector< CapaciteRaciale > DemiOgre::Liste = list_of
  ( CapaciteRaciale( "Agressivité"         ,  5 ) )
  ( CapaciteRaciale( "Brutalité"           ,  5 ) )
  ( CapaciteRaciale( "Infravision"         ,  5 ) )
  ( CapaciteRaciale( "Points de vie suppl.", 10 ) )
  ( CapaciteRaciale( "Solidité"            ,  5 ) )
  ( CapaciteRaciale( "Résistance au poison",  5 ) )
  ( CapaciteRaciale( "Demi-Ogre standard"  , 10 ) );

/**
 * Contient la liste des ensembles raciaux (ici un seul).
 */
const vector< EnsembleCapacitesRaciales > DemiOgre::Ensembles = list_of
  ( EnsembleCapacitesRaciales("Demi-Ogre standard"  , 10, ensembleRacial[0] ) );

const vector< Prerequis > DemiOgre::Limites = list_of
  ( Prerequis( 0, 14, 18 ) )
  ( Prerequis( 1,  3, 12 ) )
  ( Prerequis( 2, 14, 18 ) )
  ( Prerequis( 3,  3, 12 ) )
  ( Prerequis( 4,  3, 12 ) )
  ( Prerequis( 5,  3,  8 ) );

/**
 * Les Demi-Ogres ont +1 en Force et en Constitution, -1 en Intelligence
 * et en Charisme.
 */
const map< unsigned, int > DemiOgre::AjustTraits = map_list_of
  ( 0, 1 )
  ( 2, 1 )
  ( 3, -1 )
  ( 5, -1 );

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des
 * capacités. Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
DemiOgre::DemiOgre(const vector<unsigned>& cap)
  : Race( "Demi-Ogre" )
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  Capacites.assign( cap . begin(), cap . end() );
}

/**
 * Constructeur usuel, qui permet de créer un Demi-Ogre en sélectionnant
 * ses capacités.
 *
 * @param[in] PP nombre de pp, passé en argument afin de pouvoir
 * récupéré les pp non dépensé
 */
DemiOgre::DemiOgre(unsigned& PP)
  : Race( "Demi-Ogre" )
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un demi-ogre" << endmsg << endmsg;
  PP += 15;

  construitRace( PP );
  
  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

DemiOgre::DemiOgre()
  :Race("Demi-Ogre")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param[in] ptr pointeur sur l'instance à copier.
 */
DemiOgre::DemiOgre(Race *ptr)
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
DemiOgre::~DemiOgre()
{}

